/*
 * Copyright (C) 2007-2015 FBReader.ORG Limited <contact@fbreader.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 */

package org.geometerplus.zlibrary.text.view;

import android.graphics.Bitmap;
import android.util.Pair;

import com.example.administrator.fangbook.dataLibrary.book.ShelfItemBook;
import com.example.administrator.fangbook.read.ReadActivity;
import com.example.administrator.fangbook.read.library.readSetting.ReadSettingUtil;
import com.example.administrator.fangbook.read.view.readView.ZLAndroidWidget;

import org.geometerplus.fbreader.book.M17kPlainTxtBook;
import org.geometerplus.fbreader.book.MTxtBook;
import org.geometerplus.fbreader.bookmodel.BookModel;
import org.geometerplus.fbreader.bookmodel.TOCTree;
import org.geometerplus.fbreader.fbreader.FBReaderApp;
import org.geometerplus.fbreader.fbreader.FBView;
import org.geometerplus.fbreader.fbreader.TextBuildTraverser;
import org.geometerplus.fbreader.formats.BasicChapterReader;
import org.geometerplus.fbreader.formats.BookReader;
import org.geometerplus.fbreader.formats.IChapterReadBook;
import org.geometerplus.zlibrary.core.application.ZLApplication;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.library.ZLibrary;
import org.geometerplus.zlibrary.core.util.RationalNumber;
import org.geometerplus.zlibrary.core.util.ZLColor;
import org.geometerplus.zlibrary.core.view.SelectionCursor;
import org.geometerplus.zlibrary.core.view.SelectionTipBox;
import org.geometerplus.zlibrary.core.view.ZLPaintContext;
import org.geometerplus.zlibrary.core.view.ZLViewEnums;
import org.geometerplus.zlibrary.text.model.ZLTextMark;
import org.geometerplus.zlibrary.text.model.ZLTextModel;
import org.geometerplus.zlibrary.ui.android.view.ZLAndroidPaintContext;
import org.geometerplus.zlibrary.ui.android.view.animation.AnimationManager;

import java.util.Collection;
import java.util.List;

public abstract class ZLTextView extends ZLTextViewBase {

    /**
     * 页面绘制数据（上一页，下一页，当前页）
     */
    public ModelData myPrevModelData = new ModelData(this),
            myNextModelData = new ModelData(this),
            myCurrModelData = new ModelData(this);


    public ZLTextView(ZLApplication application) {
        super(application);
    }

    @Override
    public final void paint(ZLPaintContext context, PageIndex pageIndex) {
        setContext(context);
        FBReaderApp reader = (FBReaderApp) Application;
        if (reader == null || reader.Model == null) {
            return;
        }
        //判断是否是当前页面 坐标当前页面的章节内容是否滚动完成，如果滚动完成切换章节
        if (pageIndex == PageIndex.current) {
//            if (myCurrModelData.getReadingChapter() != null && myCurrModelData.getReadingChapter() instanceof Chapter) {
//                if (needPainTips((Chapter) myCurrModelData.getReadingChapter())) {
//                    paintTips(context);
//                    return;
//                }
//            }
            paintModel(myCurrModelData, context, pageIndex);
        } else {
//            if (isPendingLoadPageData()) {//是否延迟加载页面数据
//                ModelData modelData = getModelByPageIndex(pageIndex);
//                if (widget.isAnimating()) {
//                    drawLoadingPage(modelData, context);
//                } else {
//                    paintModel(modelData, context, PageIndex.current, false);
//                }
//            } else {
//                doProcessNoPageData(context, pageIndex);
//            }
        }
    }

    /**
     * 绘制当前页面
     *
     * @param modelData 页面数据
     * @param context
     * @param pageIndex 页面坐标
     */
    @Override
    public void paintModel(ModelData modelData, ZLPaintContext context, ZLViewEnums.PageIndex pageIndex) {
//        final ZLFile wallpaper = getWallpaperFile();
//        if (wallpaper != null) {
//            context.clear(wallpaper, getFillMode());
//        } else {
//            context.clear(getBackgroundColor());
//        }
        modelData.paintInSameModel(context, pageIndex);
//        getHeaderArea().paint(modelData, context, pageIndex);
//        getFooterArea().paint(modelData, context, pageIndex);
        if (pageIndex == PageIndex.current) {
//            drawSelectionTipBox(context);
        }
    }


    public interface ScrollingMode {
        int NO_OVERLAPPING = 0;
        int KEEP_LINES = 1;
        int SCROLL_LINES = 2;
        int SCROLL_PERCENTAGE = 3;
    }


//    protected ReadActivity.EpubDirectory getEpubDirData(TOCTree root, ShelfItemBook book) {
//        return getEpubDirData(root, book, false);
//    }
//
//    public ReadActivity.EpubDirectory getEpubDirData(TOCTree root, ShelfItemBook book, boolean forcely) {
//        if (forcely) {
//            epubDirData = null;
//        }
//        if (epubDirData == null) {
//            epubDirData = new ReadActivity.EpubDirectory(root, book);
//        }
//        if (!epubDirData.isValided(book)) {
//            epubDirData.setBookData(root, book);
//        }
//        return epubDirData;
//    }
//
//    private ReadActivity.EpubDirectory epubDirData = null;
//
//
//   /* public void setModel(ZLTextModel model) {
//        setModel(model, null);
//    }*/
//
//    /**
//     * 暂时解释为刷新界面 refreshLayout，执行在t_rendering_thread线程中
//     *
//     * @param model
//     * @param startPosition
//     */
//    public void setModel(ZLTextModel model, ZLTextPosition startPosition) {
//        synchronized (AnimationManager.mLockObj) {
//            Object readingChapter = null;
//            final FBReaderApp myReader = (FBReaderApp) FBReaderApp.Instance();
//            if (myReader != null) {
//                BasicChapterReader basicChapterReader = null;
//                if (myReader.Model != null && myReader.Model.Book != null && myReader.Model.Book instanceof IChapterReadBook) {
//                    basicChapterReader = ((IChapterReadBook) (myReader.Model.Book)).getReader();
//                    if (basicChapterReader != null) {
//                        readingChapter = basicChapterReader.getReadingChapter();
//                    }
//                }
//                myCurrModelData.setModel(readingChapter, model, startPosition);
//                if (myReader.getViewWidget() != null) {
//                    myReader.getViewWidget().reset();
//                    myReader.getViewWidget().repaintForcely();
//                    if (ReadSettingUtil.isAutoFlip() && myReader.getAppContext() != null) {
//                        myReader.getAppContext().runOnUiThread(new Runnable() {
//                            @Override
//                            public void run() {
//                                if (myReader.getAppContext() != null && myReader.getAppContext().getZLWidget() != null) {
//                                    myReader.getAppContext().getZLWidget().startAutoRead();
//                                }
//                            }
//                        });
//                    }
//                }
//            }
//        }
//    }
//
//    public final ZLTextModel getModel() {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.getModel();
//        }
//    }
//
//    public ZLTextWordCursor getStartCursor() {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.getStartCursor();
//        }
//    }
//
//    public ZLTextWordCursor getEndCursor() {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.getEndCursor();
//        }
//
//    }
//
//    private void gotoMark(ZLTextMark mark) {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.gotoMark(mark);
//        }
//    }
//
//    public void gotoHighlighting(ZLTextHighlighting highlighting) {
//        myCurrModelData.gotoHighlighting(highlighting);
//    }
//
//    public int search(final String text, boolean ignoreCase, boolean wholeText, boolean backward, boolean thisSectionOnly) {
//        synchronized (AnimationManager.mLockObj) {
//            return search(text, ignoreCase, wholeText, backward, thisSectionOnly);
//        }
//    }
//
//    public boolean canFindNext() {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.canFindNext();
//        }
//
//    }
//
//    public void findNext() {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.findNext();
//        }
//    }
//
//    public boolean canFindPrevious() {
//        synchronized (AnimationManager.mLockObj) {
//            return canFindPrevious();
//        }
//    }
//
//    public void findPrevious() {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.findPrevious();
//        }
//    }
//
//    public void clearFindResults() {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.clearFindResults();
//        }
//    }
//
//    public boolean findResultsAreEmpty() {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.findResultsAreEmpty();
//        }
//    }

//    /**
//     * 交换章节数据 switchModelData 交换，重置章节游标，有利于获取章节
//     *
//     * @param pageIndex
//     * @param toFirstPage 是否为这一章的第一页
//     */
//    protected void shiftChapter(PageIndex pageIndex, boolean toFirstPage) {
//        LogUtil.i(GlobalConstants.READER_LOG, "ZLTextView shiftChapter  " + pageIndex);
//        synchronized (AnimationManager.mLockObj) {
//            FBReaderApp reader = (FBReaderApp) FBReaderApp.Instance();
//            ZLAndroidWidget widget = (ZLAndroidWidget) reader.getViewWidget();
//            final BookModel model = reader.Model;
//            BasicChapterReader basicChapterReader = null;
//            if (model.Book instanceof M17kPlainTxtBook) {
//                M17kPlainTxtBook book = (M17kPlainTxtBook) model.Book;
//                basicChapterReader = book.getReader();
//            } else if (model.Book instanceof MTxtBook) {
//                MTxtBook book = (MTxtBook) model.Book;
//                basicChapterReader = book.getReader();
//            }
//            if (basicChapterReader != null) {
//
//                if (pageIndex == PageIndex.next) {
//
//                    LogUtil.i(GlobalConstants.READER_LOG, "ZLTextView shiftChapter  PageIndex.next " + pageIndex);
//                    ModelData swap = myCurrModelData;
//                    if (!myNextModelData.isLoaded()) {
//                        LogUtil.e("ZLLogger", "快速翻动时，callback被取消了。。");
//                        return;
//                    }
//                    myCurrModelData = myNextModelData;//下一张数据 添加到当前章
//                    myPrevModelData.setModel(basicChapterReader.getNextChapter(), null);
//                    myNextModelData = myPrevModelData;
//                    myPrevModelData = swap;
//                    BookReader bookReader = model.Book.getReader();
//                    if (bookReader != null && bookReader instanceof BasicChapterReader) {
//                        ((BasicChapterReader) bookReader).doShiftChapter(true);
//                    }
//
//                    if (myShiftChapterListener != null) {
//                        myShiftChapterListener.run();
//                        myShiftChapterListener = null;
//                    }
//                    destroyTips();
//                } else if (pageIndex == PageIndex.previous) {
//                    LogUtil.i(GlobalConstants.READER_LOG, "ZLTextView shiftChapter  PageIndex.previous " + pageIndex);
//                    LogUtil.e("LOY", "shiftChapter next mDirectlyPaintFlag:");
//                    if (!myPrevModelData.isLoaded()) {
//                        //throw new RuntimeException("不可能的事件发生了。");
//                        LogUtil.e("ZLLogger", "往后翻，不可能的事件发生了。");
//                        return;
//                    }
//                    ModelData swap = myCurrModelData;
//                    myCurrModelData = myPrevModelData;
//
//                    myNextModelData.setModel(basicChapterReader.getPreviousChapter(), null);
//
//                    myPrevModelData = myNextModelData;
//                    myNextModelData = swap;
//                    if (!toFirstPage) {
//                        getEndCursor().moveToParagraph(getModel().getParagraphsNumber() - 1);
//                        getEndCursor().moveToParagraphEnd();
//                        gotoPositionByEnd(getEndCursor().getParagraphIndex(), getEndCursor().getElementIndex(), getEndCursor().getCharIndex());
//                    } else {
//                        gotoPosition(0, 0, 0);
//                    }
//                    //gotoPosition(getStartCursor());
//                    ZLApplication.Instance().getViewWidget().reset();
//                    LogUtil.e("LOY", "shiftChapter next mDirectlyPaintFlag: 333");
//                    LogUtil.i(GlobalConstants.READER_LOG, "ZLTextView  shiftChapter");
//                    ZLApplication.Instance().getViewWidget().repaint();
//                    BookReader bookReader = model.Book.getReader();
//                    if (bookReader != null && bookReader instanceof BasicChapterReader) {
//                        ((BasicChapterReader) bookReader).doShiftChapter(false);
//                    }
//                    if (myShiftChapterListener != null) {
//                        myShiftChapterListener.run();
//                        myShiftChapterListener = null;
//                    }
//                    destroyTips();
//                }
//            }
//        }
//
//
//    }
//
//    @Override
//    public void doShiftPage(ZLViewEnums.PageIndex pageIndex) {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.onScrollingFinished(pageIndex);
//        }
//    }
//
//    public boolean removeHighlightings(Class<? extends ZLTextHighlighting> type) {
//        boolean result = myCurrModelData.removeHighlightings(type);
//        return result;
//    }
//
//    public void highlight(ZLTextPosition start, ZLTextPosition end) {
//        synchronized (AnimationManager.mLockObj) {
//            removeHighlightings(ZLTextManualHighlighting.class);
//            addHighlighting(new ZLTextManualHighlighting(this, start, end));
//        }
//    }
//
//    public final void addHighlighting(ZLTextHighlighting h) {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.adddHighligthings(h);
//            Application.getViewWidget().repaintForcely();
//        }
//    }
//
//    public final void addHighlightings(Collection<ZLTextHighlighting> hilites) {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.addHighlightings(hilites);
//            Application.getViewWidget().repaintForcely();
//        }
//    }
//
//    public void clearHighlighting() {
//        synchronized (AnimationManager.mLockObj) {
//            if (removeHighlightings(ZLTextManualHighlighting.class)) {
//
//                Application.getViewWidget().repaintForcely();
//            }
//        }
//
//    }
//
//    protected void moveSelectionCursorTo(SelectionCursor.Which which, int x, int y) {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.moveSelectionCursorTo(which, x, y);
//            Application.getViewWidget().repaintForcely();
//        }
//
//    }
//
//    protected void releaseSelectionCursor() {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.releaseSelectionCursor();
//            Application.getViewWidget().repaintForcely();
//        }
//
//    }
//
//    protected SelectionCursor.Which getSelectionCursorInMovement() {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData == null ? null : myCurrModelData.getSelectionCursorInMovement();
//        }
//    }
//
//    protected ZLTextSelection.Point getSelectionCursorPoint(ZLTextPage page, SelectionCursor.Which which) {
//        synchronized (AnimationManager.mLockObj) {
//
//            if (myCurrModelData != null) {
//
//                if (page != null) {
//                    return myCurrModelData.getSelectionCursorPoint(page, which);
//                }
//            }
//            return null;
//        }
//    }
//
//    protected ZLTextSelection.Point getSelectionCursorPoint(SelectionCursor.Which which) {
//
//        synchronized (AnimationManager.mLockObj) {
//
//            if (myCurrModelData != null) {
//                ZLTextPage page = myCurrModelData.getPage(PageIndex.current);
//                if (page != null) {
//                    return myCurrModelData.getSelectionCursorPoint(page, which);
//                }
//            }
//            return null;
//        }
//    }
//
//
//    protected SelectionCursor.Which findSelectionCursor(int x, int y) {
//        synchronized (AnimationManager.mLockObj) {
//            return findSelectionCursor(x, y, Float.MAX_VALUE);
//        }
//    }
//
//    protected SelectionCursor.Which findSelectionCursor(int x, int y, float maxDistance2) {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.findSelectionCursor(x, y, maxDistance2);
//        }
//    }
//
//    protected void drawSelectionCursor(ZLPaintContext context, ZLTextPage page, SelectionCursor.Which which) {
//        final ZLTextSelection.Point pt = getSelectionCursorPoint(page, which);
//        ZLTextSelection selection = getEditSelection();
//        if (pt != null && selection != null) {
//            SelectionCursor.draw(context, which, pt.X, pt.Y, selection.getStyleColor());
//        }
//    }
//
//
//    public ZLTextSelection.Point getLeftSelectionPoint() {
//        synchronized (AnimationManager.mLockObj) {
//            ZLTextSelection selection = getEditSelection();
//            if (selection != null) {
//                return getSelectionCursorPoint(SelectionCursor.Which.Left);
//            }
//        }
//
//        return null;
//    }
//
//    public ZLTextSelection.Point getRightSelectionPoint() {
//        synchronized (AnimationManager.mLockObj) {
//            ZLTextSelection selection = getEditSelection();
//            if (selection != null) {
//                return getSelectionCursorPoint(SelectionCursor.Which.Right);
//            }
//        }
//        return null;
//    }
//
//
//    protected void drawTTSSelectionBackground(ZLTTSTextSelection highligting,
//                                              ZLColor color, ZLTextPage page, ZLTextLineInfo info, int from,
//                                              int to, int y) {
//        if (highligting != null && from != to) {
//
//            final ZLTextElementArea fromArea = page.TextElementMap.get(from);
//            final ZLTextElementArea toArea = page.TextElementMap.get(to - 1);
//            final ZLTextElementArea selectionStartArea = highligting
//                    .getFirstArea();
//            final ZLTextElementArea selectionEndArea = highligting
//                    .getLastArea();
//
//            //LogUtil.e("TTS", "draw selection..3 " + (selectionStartArea.compareTo(toArea) <= 0) + "");
//            //LogUtil.e("TTS", "draw selection..4 " + (selectionEndArea.compareTo(fromArea) >= 0) + "");
//            if (selectionStartArea != null && selectionEndArea != null
//                    && selectionStartArea.compareTo(toArea) <= 0
//                    && selectionEndArea.compareTo(fromArea) >= 0) {
//
//                final int top = y + 1;
//                int left, right, bottom = y + info.Height + info.Descent;
//                if (selectionStartArea.compareTo(fromArea) < 0) {
//                    left = getLeftMargin();
//                } else {
//                    left = selectionStartArea.XStart;
//                }
//                if (selectionEndArea.compareTo(toArea) > 0) {
//                    right = getRightLine();
//
//                } else {
//                    right = selectionEndArea.XEnd;
//                }
//                LogUtil.e("TTS", "draw selection.. 3333");
//                if (color != null) {
//                    LogUtil.e("TTS", "draw selection.. 333");
//                    getContext().setFillColor(color);
//                    getContext().fillRectangle(left, top, right, y + info.Height
//                            + info.Descent - 4);
//
//                }
//
//
//            }
//
//        }
//    }
//
//    protected void drawSelectionBackground(ZLTextSelection highligting,
//                                           ZLColor color, ZLTextPage page, ZLTextLineInfo info, int from,
//                                           int to, int y) {
//
//        //LogUtil.e("TTS", "draw selection..222");
//
//        if (highligting == null || highligting.isEmpty()) {
//            return;
//        }
//
//
//        if (!highligting.isEmpty() && from != to) {
//
//            final ZLTextElementArea fromArea = page.TextElementMap.get(from);
//            final ZLTextElementArea toArea = page.TextElementMap.get(to - 1);
//            final ZLTextElementArea selectionStartArea = highligting
//                    .getStartArea(page);
//            final ZLTextElementArea selectionEndArea = highligting
//                    .getEndArea(page);
////            if(mTTSSelection != null && highligting.equals(mTTSSelection))
////            {
////                LogUtil.e("TTS", "draw selection.. 22 :" + highligting.hashCode() + " " + (mTTSSelection != null) + " " + (mySelection != null) + " ");
////                LogUtil.e("TTS", "draw selection..selectionStartArea != null " + (selectionStartArea != null) + "");
////
////                LogUtil.e("TTS", "draw selection..selectionEndArea != null " + (selectionEndArea != null) + "");
////            }
//
//            //LogUtil.e("TTS", "draw selection..3 " + (selectionStartArea.compareTo(toArea) <= 0) + "");
//            //LogUtil.e("TTS", "draw selection..4 " + (selectionEndArea.compareTo(fromArea) >= 0) + "");
//            if (selectionStartArea != null && selectionEndArea != null
//                    && selectionStartArea.compareTo(toArea) <= 0
//                    && selectionEndArea.compareTo(fromArea) >= 0) {
//
//                final int top = y + 1;
//                int left, right, bottom = y + info.Height + info.Descent;
//                if (selectionStartArea.compareTo(fromArea) < 0) {
//                    left = getLeftMargin();
//                } else {
//                    left = selectionStartArea.XStart;
//                }
//                if (selectionEndArea.compareTo(toArea) > 0) {
//                    right = getRightLine();
//
//                } else {
//                    right = selectionEndArea.XEnd;
//                }
//                LogUtil.e("TTS", "draw selection.. 3333");
//                if (color != null && !highligting.isUnderLine()) {
//                    LogUtil.e("TTS", "draw selection.. 333");
//                    getContext().setFillColor(color);
//                    getContext().fillRectangle(left, top, right, y + info.Height
//                            + info.Descent - 4);
//
//                }
//                if (highligting.isUnderLine()) {
//                    getContext().setLineWidth(3);
//                    getContext().setLineColor(highligting.getStyleColor());
//                    getContext().drawLine(left, bottom - 2, right, bottom - 2);
//                }
//
//            }
//
//        }
//    }
//
//    abstract public boolean needPainTips(Chapter chapter);
//
//    abstract protected void paintTips(ZLPaintContext context);
//
//    abstract public void destroyTips(Chapter chapter);
//
//    abstract public void destroyTips();
//
//    protected ModelData getModelByPageIndex(PageIndex index) {
//        ModelData modelData = myCurrModelData;
//        switch (index) {
//            case next:
//                modelData = myNextModelData;
//                break;
//            case previous:
//                modelData = myPrevModelData;
//                break;
//            default:
//        }
//        return modelData;
//    }
//
//    public ModelData myPrevModelData = new ModelData(this), myNextModelData = new ModelData(this), myCurrModelData = new ModelData(this);
//
//    protected void drawSelectionTipBox(ZLPaintContext context) {
//        ZLTextSelection selection = getEditSelection();
//        if (selection != null && !selection.isStoped()) {
//            ZLTextSelection.Point pt = selection.getCursorInMovementPoint();
//            SelectionTipBox.draw((ZLAndroidPaintContext) context, pt.X, pt.Y);
//        }
//    }

//    public static final int SCROLLBAR_HIDE = 0;
//    public static final int SCROLLBAR_SHOW = 1;
//    public static final int SCROLLBAR_SHOW_AS_PROGRESS = 2;
//
//    public abstract int scrollbarType();
//
//    @Override
//    public final boolean isScrollbarShown() {
//        return scrollbarType() == SCROLLBAR_SHOW || scrollbarType() == SCROLLBAR_SHOW_AS_PROGRESS;
//    }
//
//    protected final int sizeOfTextBeforeParagraph(int paragraphIndex) {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.sizeOfTextBeforeParagraph(paragraphIndex);
//        }
//        //return myModel != null ? myModel.getTextLength(paragraphIndex - 1) : 0;
//    }
//
//    protected final int sizeOfFullText() {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.sizeOfFullText();
//        }
//
//    }
//
//    private final int getCurrentCharNumber(ZLViewEnums.PageIndex pageIndex, boolean startNotEndOfPage) {
//
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.getCurrentCharNumber(pageIndex, startNotEndOfPage);
//        }
//    }
//
//    public ZLTextWordCursor getStartCursor(ZLViewEnums.PageIndex index) {
//
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.getStartCursor(index);
//        }
//    }
//
//    public ZLTextWordCursor getEndCursor(ZLViewEnums.PageIndex index) {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.getEndCursor(index);
//        }
//    }
//
//    @Override
//    public final int getScrollbarFullSize() {
//        synchronized (AnimationManager.mLockObj) {
//            return sizeOfFullText();
//        }
//    }
//
//    @Override
//    public final int getScrollbarThumbPosition(ZLViewEnums.PageIndex pageIndex) {
//        synchronized (AnimationManager.mLockObj) {
//            return scrollbarType() == SCROLLBAR_SHOW_AS_PROGRESS ? 0 : getCurrentCharNumber(pageIndex, true);
//        }
//    }
//
//    @Override
//    public final int getScrollbarThumbLength(ZLViewEnums.PageIndex pageIndex) {
//        synchronized (AnimationManager.mLockObj) {
//            int start = scrollbarType() == SCROLLBAR_SHOW_AS_PROGRESS
//                    ? 0 : getCurrentCharNumber(pageIndex, true);
//            int end = getCurrentCharNumber(pageIndex, false);
//            return Math.max(1, end - start);
//        }
//
//    }
//
//
//    public static class PagePosition {
//        public final int Current;
//        public final int Total;
//
//        public PagePosition(int current, int total) {
//            Current = current;
//            Total = total;
//        }
//    }
//
//
//    public final PagePosition pagePosition() {
//        synchronized (AnimationManager.mLockObj) {
//            return myCurrModelData.pagePosition();
//        }
//    }
//
//    public final RationalNumber getProgress() {
//        final PagePosition position = pagePosition();
//        return RationalNumber.create(position.Current, position.Total);
//    }
//
//
//    public void gotoHome() {
//        final ZLTextWordCursor cursor = getStartCursor();
//        if (!cursor.isNull() && cursor.isStartOfParagraph() && cursor.getParagraphIndex() == 0) {
//            return;
//        }
//        gotoPosition(0, 0, 0);
//        preparePaintInfo();
//    }
//
//
//    protected abstract ZLPaintContext.ColorAdjustingMode getAdjustingModeForImages();
//
//
//    public final void turnPage(boolean forward, int scrollingMode, int value) {
//
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.turnPage(forward, scrollingMode, value);
//        }
//    }
//
//    public final void gotoPosition(ZLTextPosition position) {
//        synchronized (AnimationManager.mLockObj) {
//            if (position != null) {
//                gotoPosition(position.getParagraphIndex(), position.getElementIndex(), position.getCharIndex());
//            }
//        }
//
//    }
//
//    public final void gotoPosition(int paragraphIndex, int wordIndex, int charIndex) {
//        synchronized (AnimationManager.mLockObj) {
//            gotoPosition(paragraphIndex, wordIndex, charIndex, true);
//        }
//    }
//
//    public final void gotoPosition(int paragraphIndex, int wordIndex, int charIndex, boolean scrollNextWhenEmptyPage) {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.gotoPosition(paragraphIndex, wordIndex, charIndex, scrollNextWhenEmptyPage);
//        }
//    }
//
//    public final void gotoPositionByElementId(int elementId, boolean scrollNextWhenEmptyPage) {
//        synchronized (AnimationManager.mLockObj) {
//            if (elementId < 0) {
//                elementId = 0;
//            }
//            if (elementId > myCurrModelData.getElementCount()) {
//                elementId = myCurrModelData.getElementCount() - 1;
//            }
//            int[] data = myCurrModelData.parseParaghAndElementId(elementId);
//            if (data != null && data.length >= 2) {
//                myCurrModelData.gotoPosition(data[0], data[1], 0, scrollNextWhenEmptyPage);
//            }
//        }
//    }
//
//    public final void gotoPositionByEnd(int paragraphIndex, int wordIndex, int charIndex) {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.gotoPositionByEnd(paragraphIndex, wordIndex, charIndex);
//        }
//    }
//
//    protected void preparePaintInfo() {
//        synchronized (AnimationManager.mLockObj) {
//            myCurrModelData.preparePaintInfo();
//        }
//    }
//
//    protected void preparePaintInfo(ZLTextPage page) {
//        {
//            myCurrModelData.preparePaintInfo(page);
//        }
//    }
//
//
//    public void clearCaches() {
//        synchronized (AnimationManager.mLockObj) {
//            resetMetrics();
//            myCurrModelData.clearCaches();
//            myPrevModelData.clearCaches();
//            myNextModelData.clearCaches();
//            Application.getViewWidget().reset();
//        }
//
//
//    }
//
//
//    /**
//     * Thread safe
//     *
//     * @param index
//     * @return
//     */
//    @Override
//    public boolean canScroll(ZLViewEnums.PageIndex index) {
//        return myCurrModelData.canScroll(index);
//    }
//
//
//    protected abstract ExtensionElementManager getExtensionManager();
//
//    public ZLTextSelection getEditSelection() {
//        return myCurrModelData.getEditSelection();
//    }
//
//    ZLTextParagraphCursor cursor(int index) {
//        return myCurrModelData.cursor(index);
//    }
//
//    public void doAddNewNote(BookReadNote note) {
//
//        myCurrModelData.doAddNewNote(note);
//
//        Application.getViewWidget().repaintForcely();
//
//    }
//
//    public void doAddNewNote(LocalDumpNote note) {
//
//        myCurrModelData.doAddNewNote(note);
//        Application.getViewWidget().repaintForcely();
//
//    }
//
//    public void doUpdateNewNote(BookReadNote note) {
//        myCurrModelData.doUpdateNewNote(note);
//
//        Application.getViewWidget().repaintForcely();
//    }
//
//    public void doDeleteNewNote(BookReadNote note) {
//
//        myCurrModelData.doDeleteNewNote(note);
//        Application.getViewWidget().repaintForcely();
//    }
//
//    public void loadZLSelectionData(List<BookReadNote> notes, List<LocalDumpNote> localNotes) {
//
//        myCurrModelData.loadZLSelectionData(notes, localNotes);
//    }
//
//    public ZLTextRegion getSelectedRegion() {
//        return myCurrModelData.getSelectedRegion();
//    }
//
//    private ZLTextRegion getSelectedRegion(ZLTextPage page) {
//        return myCurrModelData.getSelectedRegion(page);
//    }
//
//    public void selectRegion(ZLTextRegion region) {
//        myCurrModelData.selectRegion(region);
//    }
//
//
//    protected boolean isSelectStartPoint(int x, int y) {
//
//        final int dpi = ZLibrary.Instance().getDisplayDPI();
//        final int unit = dpi / 120;
//        final FBReaderApp fbReader = (FBReaderApp) FBReaderApp.Instance();
//        final FBView txtView = fbReader.getTextView();
//        final int cursorHeight = unit * 45;
//        ZLTextSelection.Point p = getSelectionCursorPoint(SelectionCursor.Which.Left);
//
//        if (p != null) {
//            int topY = p.Y - dpi / 10 - unit * 8;
//            int bottomY = topY + cursorHeight;
//            if (Math.abs(x - (p.X - unit)) <= 10 * unit && y >= topY && y <= bottomY) {
//                return true;
//            }
//        }
//        return false;
//    }
//
//    protected boolean isSelectEndPoint(float x, float y) {
//
//        final int dpi = ZLibrary.Instance().getDisplayDPI();
//        final int unit = dpi / 120;
//        final FBReaderApp fbReader = (FBReaderApp) FBReaderApp.Instance();
//        final FBView txtView = fbReader.getTextView();
//        final int cursorHeight = unit * 45;
//        ZLTextSelection.Point p = getSelectionCursorPoint(SelectionCursor.Which.Right);
//
//        if (p != null) {
//            int bottomY = p.Y + dpi / 10 + unit * 8;
//            int topY = bottomY - cursorHeight;
//            if (Math.abs(x - (p.X + unit)) <= 10 * unit && y >= topY && y <= bottomY) {
//                return true;
//            }
//        }
//        return false;
//    }
//
//    protected boolean initSelection(float x, float y) {
//        if (!myCurrModelData.initSelection(x, y)) {
//            return false;
//        }
//        Application.getViewWidget().repaintForcely();
//        return true;
//    }
//
////    public boolean initSelection(ZLTextRegion startSelection,
////                                 ZLTextRegion endSelection) {
////
////         mySelection.clearCache();
////        if (!mySelection.start(startSelection, endSelection)) {
////            return false;
////        }
////        Application.getViewWidget().reset();
////        Application.getViewWidget().repaint();
////        return true;
////    }
//
//    public void clearSelection() {
//        if (myCurrModelData != null) {
//            myCurrModelData.clearSelection();
//        }
//        if (Application != null && Application.getViewWidget() != null) {
//            Application.getViewWidget().repaintForcely();
//        }
//    }
//
//    public ZLTextHighlighting getSelectionHighlighting() {
//        return myCurrModelData.getSelectionHighlighting();
//    }
//
//    public Pair<Integer, Integer> getSelectionEndXY(ZLTextSelection selection) {
//        return myCurrModelData.getSelectionEndXY(selection);
//    }
//
//    public int getSelectionStartY() {
//        return myCurrModelData.getSelectionStartY();
//    }
//
//    public int getSelectionStartY(ZLTextSelection selection) {
//
//        return myCurrModelData.getSelectionStartY(selection);
//
//    }
//
//    public int getSelectionEndY(ZLTextSelection selection) {
//
//        return myCurrModelData.getSelectionEndY(selection);
//
//    }
//
//    public ZLTextPosition getSelectionStartPosition() {
//        return myCurrModelData.getSelectionStartPosition();
//    }
//
//    public ZLTextPosition getSelectionEndPosition() {
//        return myCurrModelData.getSelectionEndPosition();
//    }
//
//    public int getSelectionStartX() {
//        return myCurrModelData.getSelectionStartX();
//    }
//
//    public int getSelectionStartX(ZLTextSelection selection) {
//        return myCurrModelData.getSelectionStartX(selection);
//    }
//
//
//    public int getSelectionEndX(ZLTextSelection selection) {
//        return myCurrModelData.getSelectionEndX(selection);
//    }
//
//
//    public int getSelectionEndX() {
//        return getSelectionEndX(getEditSelection());
//    }
//
//    public int getSelectionEndY() {
//        return getSelectionEndY(getEditSelection());
//    }
//
//
//    protected ZLTextRegion findRegion(int x, int y, int maxDistance, ZLTextRegion.Filter filter) {
//        return myCurrModelData.findRegion(x, y, maxDistance, filter);
//    }
//
//    protected ZLTextElementAreaVector.RegionPair findRegionsPair(int x, int y, ZLTextRegion.Filter filter) {
//        return myCurrModelData.findRegionsPair(x, y, filter);
//    }
//
//    protected ZLTextPage getCurrentTextPage() {
//        return myCurrModelData.myCurrentPage;
//    }
//
//    protected ZLTTSTextSelection mTTSSelection;
//    private TextBuildTraverser mTTSraverser = null;
//    private int maxParagraghIdx = 0;
//    private ZLTextWordCursor mCursor = null;
//
//    private void init() {
//        if (mTTSraverser == null) {
//            mTTSraverser = new TextBuildTraverser(this);
//        }
//        mTTSraverser.reset();
//        if (mTTSSelection == null) {
//            mTTSSelection = new ZLTTSTextSelection();
//        }
//
//        if (mCursor == null) {
//            mCursor = new ZLTextWordCursor(getStartCursor());
//        } else {
//            mCursor.setCursor(getStartCursor());
//        }
//    }
//
//    public String startTTS() throws TTSPlayEndException {
//        synchronized (AnimationManager.mLockObj) {
//            init();
//            ZLTextElementArea firstArea = getCurrentTextPage().TextElementMap.getFirstArea();
//
//            if (firstArea == null) {
//                throw new TTSPlayEndException();
//            }
//            ZLTextElementArea lastArea;
//            lastArea = getCurrentTextPage().TextElementMap.getFirstAfterRangeInSamePragragh(this, firstArea, 20, 80);
//            if (lastArea == null) {
//                lastArea = firstArea;
//            }
//            mTTSSelection.setAreas(firstArea, lastArea);
//            mTTSraverser.traverse(firstArea, lastArea);
//
//
//            maxParagraghIdx = getEndCursor().getParagraphIndex();
//            String strContent = null;
//            strContent = mTTSraverser.getText();
//            if (strContent == null || strContent.isEmpty()) {
//                strContent = nextTTSSentence();
//            }
//            return strContent;
//        }
//
//    }
//
//    public static class TTSPlayEndException extends Exception {
//        TTSPlayEndException() {
//
//        }
//    }
//
//    public String getReadingTTSContent() throws TTSPlayEndException {
//        synchronized (AnimationManager.mLockObj) {
//            return mTTSraverser != null ? mTTSraverser.getText() : null;
//        }
//    }
//
//    public String nextTTSSentence() throws TTSPlayEndException {
//        synchronized (AnimationManager.mLockObj) {
//            init();
//            String strContent = null;
//            ZLTextElementArea firstArea = null, endArea = null;
//            do {
//                firstArea = getCurrentTextPage().TextElementMap.getFirstAfterWithoutSameOneArea(mTTSSelection.getLastArea());
//
//                if (firstArea == null) {
//                    throw new TTSPlayEndException();
//                }
//                endArea = getCurrentTextPage().TextElementMap.getFirstAfterRangeInSamePragragh(this, firstArea, 20, 80);
//                if (endArea == null) {
//                    endArea = firstArea;
//                }
//                mTTSSelection.setAreas(firstArea, endArea);
//                mTTSraverser.traverse(firstArea, endArea);
//                strContent = mTTSraverser.getText();
//            }
//            while (strContent == null || strContent.isEmpty());
//            return strContent;
//        }
//
//    }
//
////    public String nextTTSParagragh() throws TTSPlayEndException
////    {
////        init();
////        String strContent = null;
////        do {
////            mTTSraverser.reset();
////            int pragraphIdx = mTTSSelection.getFirstArea().ParagraphIndex + 1;
////            if(pragraphIdx <= maxParagraghIdx)
////            {
////                ZLTextElementArea firstArea = getCurrentTextPage().TextElementMap.getFisrtAreaInSamePragraph(pragraphIdx);
////                ZLTextElementArea lastArea = getCurrentTextPage().TextElementMap.getLastAreaInSamePragraph(firstArea);
////                mTTSSelection.setAreas(firstArea, lastArea);
////                mTTSraverser.traverse(firstArea, lastArea);
////
////                LogUtil.d("TTS", "content:" + mTTSraverser.getText());
////                strContent = mTTSraverser.getText();
////            }
////            else
////            {
////                throw  new TTSPlayEndException();
////            }
////        }
////        while(strContent == null || strContent.isEmpty());
////        return  strContent;
////
////
////    }
//
//    public void closeTTS() {
//        mTTSSelection = null;
//        if (mTTSraverser != null) {
//            mTTSraverser.reset();
//        }
//        mTTSraverser = null;
//
//    }
//
//
//    /**
//     * 绘制进入书籍，显示加载框
//     *
//     * @param modelData
//     * @param context
//     */
//    public void drawLoadingPage(ModelData modelData, ZLPaintContext context) {
//
//        LogUtil.i(GlobalConstants.READER_LOG, "ZLTextView  drawLoadingPage() 记载页眉和页脚");
//
//        if (getAnimationType() == Animation.vertical) {
//            context.clear(new ZLColor(255, 255, 255, 0));
//        } else {
//            final ZLFile wallpaper = getWallpaperFile();
//            if (wallpaper != null) {
//                context.clear(wallpaper, getFillMode());
//            } else {
//                context.clear(getBackgroundColor());
//            }
//        }
//        ZLAndroidPaintContext ctx = (ZLAndroidPaintContext) context;
//        //加载图像信息
//        Bitmap bmp = ReadRenderSetting.getInstance().getReadLoadingBitmap();
//        if (bmp != null && !bmp.isRecycled()) {
//            int x = (context.getWidth() - bmp.getWidth()) / 2;
//            int y = (context.getHeight() - bmp.getHeight()) / 2;
//            ctx.drawBitmap(x, y, bmp);
//        }
//        //绘制顶部书籍名称和电量时间显示
//        getHeaderArea().paint(modelData, ctx, PageIndex.current);
//        //绘制底部阅读进度和章节名称
//        getFooterArea().paint(modelData, ctx, PageIndex.current);
//    }
//
//
//    public final void outlineRegion(ZLTextRegion region) {
//        myCurrModelData.outlineRegion(region);
//    }
//
//    public boolean isSelectionEmpty() {
//        return myCurrModelData.isSelectionEmpty();
//    }
//
//    public ZLTextRegion getOutlinedRegion() {
//        return myCurrModelData.getOutlinedRegion();
//    }
//
//    protected ZLTextHighlighting findHighlighting(int x, int y, int maxDistance) {
//
//        return myCurrModelData != null ? myCurrModelData.findHighlighting(x, y, maxDistance) : null;
//    }
//
//    public void hideOutline() {
//        myCurrModelData.hideOutline();
//    }
//
//    public ZLTextRegion nextRegion(ZLViewEnums.Direction direction, ZLTextRegion.Filter filter) {
//        return myCurrModelData.nextRegion(direction, filter);
//    }
//
//    private Runnable myShiftChapterListener = null;
//
//    public void setOnShiftChapterListener(Runnable r) {
//        myShiftChapterListener = r;
//    }
//
//    public boolean modelDataLoaded(ZLFile file) {
//        return myCurrModelData.myLoadFile != null && file != null && myCurrModelData.myLoadFile.equals(file);
//    }
}
